非同步影像管線的同步化

相機同步

VisualApplets 的一項強大功能是能夠結合來自不同相機來源的影像。 在接下來的內容中,我們將學習如何

  1. 在相機來源之間切換
  2. 疊加兩個相機的影像
  3. 多工處理相機影像
  4. 拼接兩個相機的影像

在兩台相機之間切換

若要在兩部相機之間切換,我們需要一個包含兩個相機模組的簡單設計。 在 VisualApplets 中,可以使用 SourceSelector 運算子(請參閱 'SourceSelector')在兩個非同步來源之間進行切換。 此運算子允許選擇其中一個輸入,同時丟棄其他輸入上的資料。 如果選擇其中一個輸入,其他輸入的行為將如同連接至 Trash 運算子一樣。 您可以在擷取進行中時切換輸入。該運算子將在新的影格開始時進行切換。 兩個輸入的影格率和影像尺寸不需要相同。

用於在兩部相機之間切換的 VisualApplets 設計

圖 208:用於在兩部相機之間切換的 VisualApplets 設計


結合來自兩個相機來源的影像資料 - 建立重疊混合 (Overlay Blend)

接下來,我們將探討如何結合兩部相機的影像資料。 在我們的範例中,我們使用覆疊混合(overlay-blend)來結合這兩個影像。

我們範例的規格如下:

  • 相機:兩部基底組態模式下的 CameraLink RGB 面陣相機
  • 解析度:1024 x 1024 像素
  • 覆疊混合:

    方程式 1:覆疊混合


  1. 基礎運算子

    我們從設計中的基礎運算子開始,如下圖所示。 我們可以使用所有預設參數和連結屬性。

  2. 同步

    接下來,我們需要同步兩部相機的資料串流。 這只需使用 SYNC 運算子即可完成。 SYNC 運算子會控制其輸入,使輸出完全同步。 如您所見,我們在同步之前使用了兩個緩衝區模組。 我們必須使用它們,因為我們無法確保兩部相機 100% 同步。

    儘管我們已經同步了影像資料,但仍需注意一些限制條件:

    • 兩部相機的影格數(即影格率)必須相同。 如果一部相機的影格率高於另一部相機,其中一個 ImageBuffer 模組將需要儲存一些影像, 並可能會進入溢位(overflow)狀態。 因此,對於長時間的擷取,兩部相機必須使用相同的影格率來擷取影格。 觸發系統可以確保這一點。

    • 兩部相機 ROI 的影像尺寸和影像位置可能會有所不同。 SYNC 運算子將根據其參數設定,自動將較小的影像擴展至較大者,或裁剪較大的影像。 請參閱 SYNC 運算子的說明以取得更多詳細資料:('SYNC')
  3. 覆疊混合

    最後一步是實作覆疊混合以結合這兩個影像。 為了方便起見,我們使用階層方塊(hierarchical box)來實作覆疊混合。

    覆疊混合必須個別套用於所有色彩分量。 因此,我們需要將連結分割為所有三個色彩分量。 覆疊混合再次被放置在階層方塊中。 因此,我們目前的階層方塊內包含三個階層方塊。 您可以使用複製和貼上功能來複製每個色彩分量的方塊。

    使用 VisualApplets 運算子實現上述方程式的方法有多種。 一般而言,在實作方程式之前,您應該始終嘗試針對 FPGA 的使用調整並最佳化方程式。

    該方程式包含一些常數值的乘法與除法。 這些運算在 VisualApplets 中可用,但在 FPGA 上實現時效率不高。 如果乘法或除法可以寫成 2 的冪次方乘法,我們就可以使用簡單的位元位移來實現。 位元位移將完全不需要任何資源! 我們將簡化

    設為

    這是一個簡單的 7 位元右移,即我們捨棄最低的七個位元。

    接下來,方程式中有些部分如 255 減去 ColorA。 這是一個簡單的色彩反相。白色變為深色,深色變為白色。 數值的反相也可以透過對每個位元進行簡單的反相來完成。 這最終讓我們能夠改寫方程式:

    方程式 2。針對 FPGA 實現的最佳化覆疊混色 (Overlay Blend)


    我們現在可以開始進行實現。 方程式中剩餘的運算可作為 VisualApplets 運算子使用。 我們將需要

    • IF

    • NOT 用於反相

    • ShiftRight 用於除以 2^7

    • HWMULT 用於乘法

      除了 HWMULT 之外,VisualApplets 還包含 MULT 運算子。 它們的作用相同,但 HWMULT 會使用 FPGA 中的專用乘法器,因此需要少得多的資源。

    • 為了限制位元深度,我們將需要一個 CastBitWidth 運算子。 此運算子可用於透過捨棄 MSB 從 9 位元切換到 8 位元。 從公式中我們知道不會有大於 255 的值。

  4. 使用模擬進行驗證

    1. 我們可以使用 VisualApplets 模擬輕鬆驗證溢位混色 (overflow-blend) 的功能。 使用兩個模擬來源為兩個攝影機注入影像。 將模擬探棒放置在您喜歡的任何連結上。 模擬結果將向您顯示兩個影像的覆疊。 如果感興趣,您也可以在階層式方塊中檢查覆疊的中間結果。

    2. 無法透過模擬來驗證同步,因為模擬僅能反映 applet 的功能部分,而無法反映時序。 需要在硬體中進行驗證。
  5. 新增觸發

    如前所述,兩個攝影機必須以相同的影格率執行,以避免其中一個緩衝區發生溢位。 這可以透過觸發系統輕鬆解決。

多工處理兩台相機的影像

在 VisualApplets 中多工處理影像或線條非常簡單。 我們將從多工處理兩個攝影機影像的範例開始, 亦即我們想要使用相同的 DMA 通道來交替輸出攝影機 A 和攝影機 B 的影像。

  1. 基礎運算子

    我們將需要使用兩個攝影機模組、兩個緩衝區和一個 DMA 的兩個攝影機標準設計。

  2. 多工處理影像

    為了多工處理影像,我們使用 InsertImage 運算子。 此運算子將會依序轉發其輸入的影像。 例如,如果我們使用兩個輸入,運算子將依序轉發輸入 0、1、0、1、0、1、... 的影像。 因此,在處理完一個輸入後,將使用下一個輸入。 因此,要求兩個輸入端的影格數必須相同,亦即輸入端必須具有相同的影格率。

    如您所見,我們將影像緩衝區模組放置在插入作業之前。這是因為 InsertImage 運算子本身沒有緩衝區。 當輸入 0 的影像被轉發時,輸入 1 會被封鎖,因此需要緩衝攝影機影像以避免資料遺失。

    對於每個輸入(I0、I1、…),運算子提供第二個名為 Ins0、Ins1、… 的輸入。 此輸入是一個控制輸入,用於控制是否應使用或捨棄影像。 因此,如果 Ins 輸入端的值為 0,則可以跳過該輸入;如果提供值 1,則會使用該輸入。 輸入群組 I 和 Ins 必須是同步的,亦即它們必須透過任意的 O 型運算子網路來取得相同的 M 型運算子來源。 請參閱 'Operator Types' 以取得更多資訊。由於兩個輸入是同步的,因此它們需要具有相同的影像尺寸。 InsertImage 將使用 Ins 輸入上的第一個像素來決定是使用還是捨棄影像。 如您在先前的螢幕擷取畫面中所見,我們只需使用 CONST 運算子即可啟用影像的使用。 將 CONST 運算子的輸出連結位元深度設定為 1 位元,並將參數「Value」設定為 1 以啟用插入作業。

    請注意:如果其中一個 Ins 輸入端的值為零,運算子仍需處理該輸入端上的影像。 值為零並不表示不需要提供影像。如果在某個輸入端未提供影像,運算子將會一直等待,直到有影像可用為止。

    如前所述,每次總是開啟其中一個輸入,而其他輸入則被封鎖。 影像必須非同步取得,例如從不同的緩衝區取得。 在下圖中,您可以看到兩個無法運作的組態。 您將不會從 applet 獲得任何結果,因為它處於自我封鎖狀態。這就是所謂的「死結」狀況。

    使用 InsertImage 的死結組態

    圖 209. 使用 InsertImage 的死結組態


    請隨時檢查當其中一個輸入停止時,另一個輸入是否可以進行緩衝。 請勿忘記,DRC 或模擬無法偵測到死結狀況。 有關死結的更多資訊,請參閱 'Timing Synchronization'。

兩個相機的拼接

在上一節中,我們多工處理了兩個相機的影像。拼接的作法幾乎完全相同。 我們改用 InsertLine operator,並需要使用 AppendLine operator 來附加兩個連續的行。

InsertLine 將首先多工處理兩個輸入的行,然後我們需要附加兩行。

當然,最後兩個範例也可以使用相同的影像來源。 我們唯一需要注意的是,在插入之前是否有足夠的緩衝區。 若要插入影像,我們需要緩衝完整的影像。 若要複製行,我們只需要緩衝其中一行,同時在另一條路徑上處理相同的行。 若只要緩衝幾行,我們可以使用 ImageFifo operator。此 operator 不會使用 frame grabber DRAM memory。 取而代之的是,它使用 FPGA internal BlockRAM memory。 我們將設定 FIFO 以最多儲存一行。 在以下範例中,我們複製了影像行,且該複製是反向的。 因此我們的結果是左側為原始影像,右側為反向(負片)版本。

Line Duplication

圖 210. Line Duplication